削除保留中の KMS キーが使用された場合に、自動でステータスを無効にする仕組みを実装してみた
はじめに
テクニカルサポートの 片方 です。
カスタマー管理型のキーを削除保留中状態にした際に、当該キーを使用される可能性も考えられます。
そのため、削除保留中にキーが使用された場合、自動的にステータスを "無効"にする仕組みを実装してみました。
使用するサービス・機能
- AWS CloudTrail
- Amazon CloudWatch Logs
- Amazon CloudWatch アラーム
- Amazon EventBridge
- Systems Manager Automation ランブック: AWSConfigRemediation-CancelKeyDeletion
上記のサービスを使用します。
流れとしましては、AWS CloudTrail、Amazon CloudWatch Logs の機能を組み合わせて、アカウント内の誰かが削除保留中の KMS キーを使用しようとしたときにアラーム状態となるように Amazon CloudWatch アラームを作成します。
その後に、当該 CloudWatch アラームのアラーム状態をトリガーに Amazon EventBridge を介して Systems Manager Automation ランブック: AWSConfigRemediation-CancelKeyDeletion を実行させて、キーの削除をキャンセルさせてステータスを無効にします。
※ 以下はイメージです
実装してみた
前途でご案内した、AWS CloudTrail、Amazon CloudWatch Logs ~ CloudWatch アラームの実装については弊社ブログを参考に対応してください。
後程以下の情報が必要となるので、メモしてください。
- Cloudwatch アラーム名
- 削除保留中にする対象のキー ID
ロール
2 つロールを作成します。
先ずは AutomationAssumeRole で設定するためのロール
ロール名: AmazonSSMAutomationRole
※ 信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"events.amazonaws.com",
"ec2.amazonaws.com",
"ssm.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
アタッチするポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetAutomationExecution",
"ssm:StartAutomationExecution"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"kms:CancelKeyDeletion",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
EventBridge でのイベントの実行に必要な IAM ロール
ロール名: Amazon_EventBridge_Invoke_Start_Automation_Execution_Roll
※ 信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"ssm.amazonaws.com",
"events.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
アタッチするポリシー例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:*"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "arn:aws:iam::アカウントID:role/AmazonSSMAutomationRole",
"Condition": {
"StringLikeIfExists": {
"iam:PassedToService": "ssm.amazonaws.com"
}
}
}
]
}
"iam:PassRole" の "Resource" では先に作成したロールの arn を記載してください。
Amazon EventBridge
ルール名 kms で作成しました。
イベントパターンを持つルールを選択します。
イベントソースはその他を選択し、下部へスクロールします。
カスタムパターン(JSON エディタ)を選択。プレフィックスマッチングになっていること確認して以下の例を参考に json を記述します。
こちらでは、作成した CloudWatch アラーム名を記述します。完了したら次へ。
{
"source": ["aws.cloudwatch"],
"detail": {
"alarmName": ["test-kms-error"],
"state": {
"value": ["ALARM"]
}
}
}
以下に設定します。
- AWS のサービス
- Systems Manager オートメーション
- AWSConfigRemediation-CancelKeyDeletion
自動化パラメータを設定で、定数を選択。
AutomationAssumeRole では作成したロール名: AmazonSSMAutomationRole の arn を記載します。
KeyId では、対象のキー ID を記載します。※ 削除済みなので記載しています。
実行ロールでは既存のロールを使用し、作成したロール名: Amazon_EventBridge_Invoke_Start_Automation_Execution_Roll を選択します。
これで、実装は完了です。お疲れさまでした!
検証してみた
対象キーを削除保留中に設定します。
検証するため、Fleet Manager で当該キーを利用して KMS 暗号化を有効化します。
その後に、セッションマネージャーを使用したいと思います。
当該キーは削除保留中であるためエラーが出力されました。
作成した CloudWatch アラームもアラーム状態になりました。
Amazon EventBridge も上手く動作しています。
自動的にステータスが無効になったことを確認しました。
なお、CloudTrail に CancelKeyDeletion のイベント履歴があることを確認してます。成功です!
まとめ
本ブログが誰かの参考になれば幸いです。
参考資料
- AWSConfigRemediation-CancelKeyDeletion - AWS Systems Manager オートメーションランブックリファレンス
- 削除予定のAWS KMS鍵が利用されたら通知する | DevelopersIO
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。